Abstract
En este laboratorio se trabaja con dos modelos económicos cuyo objetivo es la valoración de activos financieros riesgosos, los cuales son:
Durante el desarollo se comparan los datos obtenidos con los modelos y datos reales para validación.
La teoría de valuación de activos se utiliza para modelar el precio de activos riesgosos como un flujo de pagos, desde un punto de vista económico y con una perspectiva de un pago esperado ya sea por vender el activo en algún momento.
El valor obtenido se compone de dos partes: el precio y si existen dividendos.
La mejor manera de modelar un precio a futuro es con un modelo estocástico ya que no se tiene certeza absoluta de lo que pasará en cierto periodo, especialmente se utiliza el proceso estocástico "Martingala" que es una secuencia de variables aleatorias que en un tiempo dado, la esperanza condicional del siguiente valor de la secuencia, dado todos los valores anteriores, es igual al valor presente.
En un mercado eficiente, el valor fundamental de un valor fluctúa aleatoriamente.
Sin embargo, los costos de negociación inducen una dependencia serial negativa en los sucesivos mercados observados, el precio cambia.
Dada la eficiencia del mercado, el diferencial efectivo entre oferta y demanda puede ser medido por:
$$ Spread = 2 \sqrt{-cov} $$donde "cov" es la covarianza serial de primer orden de los cambios de precio.
[THE JOURNAL OF FINANCE VOL. XXXIX, NO. 4 SEPTEMBER ]
In order to run this notebook, it is necessary to have installed and/or have the requirements.txt file with the following:
Las siguientes son las dependencias de archivos que se necesitan para ejecutar este notebook:
Es necesario correr la siguiente celda para instalar los paquetes utilizados en el laboratorio:
%%capture
# Install all the pip packages in the requirements.txt
import sys
!{sys.executable} -m pip install -r requirements.txt
import numpy as np
import pandas as pd
import data as dt
import functions as fn
#import visualizations as vs
import main as mn
Para los modelos APT: Asset Pricing Theory y ROLL MODEL se utilizó un día de la base de datos 'orderbooks_05jul21.json'
fn.sample_from_dict(dt.ob_data)
{'2021-07-05T13:50:02.912Z': bid_size bid ask ask_size
0 0.449533 28419.0 28428.0 0.005000
1 1.958206 28417.0 28429.0 0.233349
2 0.908100 28416.0 28430.0 0.487378
3 0.526112 28415.0 28431.0 0.435960
4 1.501108 28414.0 28432.0 0.841408
5 1.203160 28413.0 28433.0 0.035051
6 0.230285 28412.0 28434.0 0.585040
7 0.227353 28411.0 28435.0 0.973366
8 0.105000 28410.0 28436.0 2.164567
9 1.212367 28409.0 28437.0 1.197802
10 1.289681 28408.0 28438.0 0.370726
11 0.445293 28407.0 28439.0 1.647011
12 0.443628 28406.0 28440.0 1.805588
13 1.645800 28405.0 28441.0 0.133317
14 0.067730 28404.0 28442.0 0.134720
15 0.660000 28403.0 28443.0 1.287366
16 0.296480 28402.0 28444.0 0.436600
17 0.809119 28401.0 28445.0 5.101665
18 0.004400 28399.0 28446.0 6.518413
19 1.834283 28398.0 28447.0 2.942445
20 0.999265 28397.0 28448.0 0.381216
21 0.785637 28395.0 28449.0 1.368076
22 2.337697 28394.0 28450.0 0.718547
23 0.133317 28393.0 28451.0 0.759546
24 2.440469 28392.0 28452.0 5.989659}
Resultados experimento 1 midprice:
fn.experimento_1_midprice(dt.ob_data)
| e1 | e2 | total | |
|---|---|---|---|
| cantidad | 1763.00 | 637.00 | 2400 |
| proporcion | 0.73 | 0.27 | 2400 |
Escenario 1 y 2 para el experimento 2 (utilizando el midprice) y su proporcion respecto a martingala:
fn.df_exp2_2.head(5)
| e1 | e2 | total | proporcion1 | proporcion2 | |
|---|---|---|---|---|---|
| 0 | 6 | 2 | 8 | 0.750000 | 0.250000 |
| 1 | 27 | 13 | 40 | 0.675000 | 0.325000 |
| 2 | 31 | 8 | 39 | 0.794872 | 0.205128 |
| 3 | 27 | 11 | 38 | 0.710526 | 0.289474 |
| 4 | 30 | 10 | 40 | 0.750000 | 0.250000 |
fn.df_exp2_2.tail(5)
| e1 | e2 | total | proporcion1 | proporcion2 | |
|---|---|---|---|---|---|
| 55 | 28 | 11 | 39 | 0.717949 | 0.282051 |
| 56 | 30 | 8 | 38 | 0.789474 | 0.210526 |
| 57 | 33 | 7 | 40 | 0.825000 | 0.175000 |
| 58 | 27 | 12 | 39 | 0.692308 | 0.307692 |
| 59 | 26 | 12 | 38 | 0.684211 | 0.315789 |
Visualización:
En la siguiente gráfica se puede apreciar que alrededor del 75% de las veces la predicción martingala es correcta.
fn.grafica_midprice(data = fn.df_exp2_2, price_type = 'Mid Price', colors = ['orange', 'red'])
La gráfica anterior muestra la proporción del modelo a un proceso estocástico del tipo martingala.
Resultados experimento 1 weighted midprice:
fn.experimento_1_w_midprice(dt.ob_data)
| e1 | e2 | total | |
|---|---|---|---|
| cantidad | 1622.00 | 778.00 | 2400 |
| proporcion | 0.68 | 0.32 | 2400 |
Escenario 1 y 2 para el experimento 2 (utilizando el weighted midprice) y su proporcion respecto a martingala:
fn.df_exp2_2_w.head(5)
| e1_w | e2_w | total_w | proporcion1_w | proporcion2_w | |
|---|---|---|---|---|---|
| 0 | 6 | 2 | 8 | 0.750000 | 0.250000 |
| 1 | 27 | 13 | 40 | 0.675000 | 0.325000 |
| 2 | 26 | 13 | 39 | 0.666667 | 0.333333 |
| 3 | 26 | 12 | 38 | 0.684211 | 0.315789 |
| 4 | 27 | 13 | 40 | 0.675000 | 0.325000 |
fn.df_exp2_2_w.tail(5)
| e1_w | e2_w | total_w | proporcion1_w | proporcion2_w | |
|---|---|---|---|---|---|
| 55 | 26 | 13 | 39 | 0.666667 | 0.333333 |
| 56 | 28 | 10 | 38 | 0.736842 | 0.263158 |
| 57 | 27 | 13 | 40 | 0.675000 | 0.325000 |
| 58 | 26 | 13 | 39 | 0.666667 | 0.333333 |
| 59 | 26 | 12 | 38 | 0.684211 | 0.315789 |
Visualización:
fn.grafica_midprice_w(data = fn.df_exp2_2_w, price_type = 'Mid Price', colors = ['orange', 'red'])
Data frame con los resultados del bid, ask, mid y spread reales y el ask, bid y mid calculados con el modelo roll.
fn.roll_model(fn.data_ob,fn.l_mid).head(5)
| ask | ask_roll | bid | bid_roll | mid | mid_roll | spread | |
|---|---|---|---|---|---|---|---|
| 2021-07-05 13:06:46.571000+00:00 | 28275.0 | 28272.535 | 28270.0 | 28272.465 | 28272.5 | 28272.54 | 5.0 |
| 2021-07-05 13:06:47.918000+00:00 | 28275.0 | 28272.535 | 28270.0 | 28272.465 | 28272.5 | 28272.54 | 5.0 |
| 2021-07-05 13:06:49.414000+00:00 | 28275.0 | 28272.535 | 28270.0 | 28272.465 | 28272.5 | 28272.54 | 5.0 |
| 2021-07-05 13:06:51.077000+00:00 | 28278.0 | 28276.535 | 28275.0 | 28276.465 | 28276.5 | 28276.54 | 3.0 |
| 2021-07-05 13:06:52.426000+00:00 | 28278.0 | 28276.535 | 28275.0 | 28276.465 | 28276.5 | 28276.54 | 3.0 |
fn.roll_model(fn.data_ob,fn.l_mid).tail(5)
| ask | ask_roll | bid | bid_roll | mid | mid_roll | spread | |
|---|---|---|---|---|---|---|---|
| 2021-07-05 14:06:40.583000+00:00 | 28362.0 | 28358.535 | 28355.0 | 28358.465 | 28358.5 | 28358.54 | 7.0 |
| 2021-07-05 14:06:41.919000+00:00 | 28362.0 | 28358.535 | 28355.0 | 28358.465 | 28358.5 | 28358.54 | 7.0 |
| 2021-07-05 14:06:43.416000+00:00 | 28362.0 | 28358.535 | 28355.0 | 28358.465 | 28358.5 | 28358.54 | 7.0 |
| 2021-07-05 14:06:45.070000+00:00 | 28359.0 | 28356.535 | 28354.0 | 28356.465 | 28356.5 | 28356.54 | 5.0 |
| 2021-07-05 14:06:46.412000+00:00 | 28359.0 | 28356.535 | 28354.0 | 28356.465 | 28356.5 | 28356.54 | 5.0 |
Como se puede observar en el dataframe, los valores estimados con el modelo roll fueron muy similares a los valores teóricos.
visualización:
Gráfica con los valores teóricos:
fn.grafica_datos(fn.datos)
Gráfica con los valores observados en el modelo roll:
fn.grafica_datos2(fn.datos)
Con este laboratorio se estimaron precios a través de dos diferentes modelos, que fueron validados, en el caso de Asset Pricing Theory con el cálculo de su proporción en martingala y el Roll model al comparar resultados con datos reales, lo que puedo relacionar de ambos es principalmente que se utiliza una secuencia de variables aleatorias cuando se quiere una estimación.
[1] Munnoz, 2020. Python project template. https://github.com/iffranciscome/python-project. (2021).
[2] Munnoz, 2017. Asset Pricing Theory.
[3] Munnoz, 2017. Roll Model.
[4] THE JOURNAL OF FINANCE. VOLXXXIX, NO. 4, SEPTEMBER 1984